﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Sysgeprava.Entities;
using Sysgeprava.BL;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Sysgeprava.Web.Controllers
{
    public class TrabajadorController : Controller
    {
        [Dependency]
        public ITrabajadorBL trabajadorBL { get; set; }

        [Dependency]
        public IFotoTrabajadorBL fotoTrabBL { get; set; }
        //
        // GET: /Trabajador/

        public ActionResult Index()
        {
            var trabajador = trabajadorBL.GetAllFromTrabajador();
            return View(trabajador);
        }


        public ActionResult Create()
        {
            var trabajador = new TRABAJADOR();
            return View(trabajador);
        }

        [HttpPost]
        public ActionResult Create(FormCollection colection, TRABAJADOR _trabajador, HttpPostedFileBase image)
        {
            var trabajador = new TRABAJADOR();
            var fotoTrab = new FOTO_TRABAJADOR();

            try
            {
                if (image == null)
                {
                    
                    fotoTrab.Imagen = null;
                    fotoTrab.IdTrabajador = trabajador.Id;
                    fotoTrab.Hash = null;
                }
                if (image != null)
                {
                    var TipoImagen = image.ContentType;
                    int length = image.ContentLength;
                    byte[] buffer = new byte[length];
                    image.InputStream.Read(buffer, 0, length);

                    StringBuilder sb = new StringBuilder();
                    /*Obtenemos la encriptacion en md5*/
                    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    byte[] hash = md5.ComputeHash(buffer);
                    foreach (var item in hash)
                    {
                        sb.Append(item.ToString("x2").ToUpper());
                    }

                    fotoTrab.Imagen = buffer;
                    fotoTrab.IdTrabajador = trabajador.Id;
                    fotoTrab.Hash = sb.ToString();
                }

                trabajador.Dni = _trabajador.Dni;
                trabajador.ApePaterno = _trabajador.ApePaterno.ToUpper();
                trabajador.ApeMaterno = _trabajador.ApeMaterno.ToUpper();
                trabajador.Nombre = _trabajador.Nombre.ToUpper();
                trabajador.Direccion = _trabajador.Direccion.ToUpper();
                trabajador.Telefono = _trabajador.Telefono;
                trabajador.FOTO_TRABAJADOR = fotoTrab;

                trabajadorBL.AddTrabajador(trabajador);
                //TempData["AlertMessage"] = "Registro Correcto";
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                
                var msg = ex.Message;
                msg = "Trabajdor no pudo ser Registrado, favor revise información";
                TempData["AlertMessage"] = msg;
                return RedirectToAction("Create");
            }
        }

        public ActionResult Edit(Int32 id)
        {
            var trabajador = trabajadorBL.GetAllFromTrabajadorById(id);
            return View(trabajador);
        }

        [HttpPost]
        public ActionResult Edit(int id, FormCollection colection, TRABAJADOR _trabajador, HttpPostedFileBase image)
        {
            var trabajador = new TRABAJADOR();
            var fotoTrab = new FOTO_TRABAJADOR();

            try
            {
                if (image == null)
                {
                    var foto = fotoTrabBL.GetFromFotoTrabajadorByTrabajadorId(id);

                    fotoTrab.Imagen = foto.Imagen;
                    fotoTrab.IdTrabajador = _trabajador.Id;
                    fotoTrab.Hash = foto.Hash;
                }
                if (image != null)
                {
                    var TipoImagen = image.ContentType;
                    int length = image.ContentLength;
                    byte[] buffer = new byte[length];
                    image.InputStream.Read(buffer, 0, length);

                    StringBuilder sb = new StringBuilder();
                    /*Obtenemos la encriptacion en md5*/
                    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    byte[] hash = md5.ComputeHash(buffer);
                    foreach (var item in hash)
                    {
                        sb.Append(item.ToString("x2").ToUpper());
                    }

                    fotoTrab.Imagen = buffer;
                    fotoTrab.IdTrabajador = _trabajador.Id;
                    fotoTrab.Hash = sb.ToString();
                }

                trabajador.Id = _trabajador.Id;
                trabajador.Dni = _trabajador.Dni;
                trabajador.ApePaterno = _trabajador.ApePaterno.ToUpper();
                trabajador.ApeMaterno = _trabajador.ApeMaterno.ToUpper();
                trabajador.Nombre = _trabajador.Nombre.ToUpper();
                trabajador.Direccion = _trabajador.Direccion.ToUpper();
                trabajador.Telefono = _trabajador.Telefono;
                trabajador.FOTO_TRABAJADOR = fotoTrab;

                trabajadorBL.UpdateTrabajador(trabajador);
                //TempData["AlertMessage"] = "Registro Correcto";
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Trabajdor no pudo ser Editado, favor revise información";
                TempData["AlertMessage"] = msg;
                return RedirectToAction("Edit");
            }
        }

        public ActionResult Details(Int32 id)
        {
            var trabajador = trabajadorBL.GetAllFromTrabajadorById(id);
            var fotoTrab = fotoTrabBL.GetFromFotoTrabajadorByTrabajadorId(trabajador.Id);

            trabajador.FOTO_TRABAJADOR = fotoTrab;
            return PartialView(trabajador);
        }

        public ActionResult Inactivo(Int32 id)
        {
            var trabajador = trabajadorBL.GetAllFromTrabajadorById(id);

            trabajador.Inactivo = true;
            trabajadorBL.InactivoTrabajador(trabajador);
            return RedirectToAction("Index");
        }

        public ActionResult GetImagen(Int32 id)
        {
            var foto = fotoTrabBL.GetFromFotoTrabajadorByTrabajadorId(id);

            if (foto.Imagen != null)
            {
                return File(foto.Imagen, "image/jpeg", Server.UrlEncode(foto.Hash));
            }
            else
            {
                var path = Path.Combine("~/Images/trabDefault.png");
                return File(path, "image/jpeg");
            }
        }

        public ActionResult ValidarDni(string dni, int id = 0 )
        {
            var trabajador = trabajadorBL.GetAllFromTrabajadorByDni(dni);

            var existe = trabajador == null ? false : true;

            var result = new
            {
                existe = existe,
                nomTrabajador = trabajador != null ? trabajador.NombreCompleto : ""
            };

            return Json(result, JsonRequestBehavior.AllowGet);
        }

    }
}
